/**
 * 对象进入老年代的场景体验一下
 * -XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520
 * -XX:SurvivorRatio=8  -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC
 * -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
 * 运行日志在根目录gc.log，看不懂就画图。
 */
public class ToOldSpace1 {
    public static void main(String[] args) {
        byte[] array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = null;

        byte[] array2 = new byte[128 * 1024];

        byte[] array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[128 * 1024];
        array3 = null;

        byte[] array4 = new byte[2 * 1024 * 1024];
    }

    /**
     * 在这里连续创建了3个2MB的数组，最后还把局部变量array1设置为了null
     *
     * 接着执行了这行代码：byte[] array2 = new byte[128 * 1024];。此时会在Eden区创建一个128KB的数组同时由array2变量来引用
     *
     * 然后会执行下面的代码：byte[] array3 = new byte[2 * 1024 * 1024];
     *
     * 此时希望在Eden区再次分配一个2MB的数组，大家觉得可行吗？
     *
     * 因为此时Eden区里已经有3个2MB的数组和1个128KB的数组，大小都超过6MB了，Eden总共才8MB，此时是不可能让你创建2MB的数组的。
     *
     * 因此此时一定会触发一次Young GC，接着我们开始看GC日志。
     *
     * 接着array3分配2个2MB的数组，然后再分配一个128KB的数组，最后是让array3变量指向null
     *
     * 此时接着会运行下面的代码：byte[] array4 = new byte[2 * 1024 * 1024];
     *
     * 这个时候，大家会发现，Eden区如果要再次放一个2MB数组下去，是放不下的了，所以此时必然会触发一次Young GC。
     *
     * Survivor From区里的那700kb的对象，超过了survivor区50%，直接进入老年代。
     */
}
